class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        // 这道题其实就转化为一段连续子数组中最多只能出现两种编号，且求出这两种编号覆盖的最大范围
        // 比如fruits = [1,2,3,2,2]，后面2，3，2，2这段连续子数组只有2和3这两种编号，且范围最大

        int n = fruits.size(), left = 0, ans = 0, kinds = 0;

        // unordered_map<int, int> countmap;
        // 使用数组代替哈希表
        int countmap[100001] = { 0 };   

        for(int i = 0; i < n; i++)
        {
            // 进窗口，如果进窗口之前该编号未被使用，则kind++
            if(countmap[fruits[i]] == 0)
                kinds++;
            countmap[fruits[i]]++;

            // 判断，窗口中，编号大于2了，需要将左边界往右移，直到窗口中的编号种类只有2种
            while(kinds > 2)
            {
                // 左边界对应的编号的个数减减
                countmap[fruits[left]]--;

                // 如果左边界指向的编号所对应的个数减为0了，那就说明该窗口的该种编号没有了，则编号数kind--
                if(countmap[fruits[left]] == 0) 
                    kinds--;
                
                // 左边界记得右移
                left++;
            }

            // 更新结果
            ans = max(ans, i - left + 1);
        }
        return ans;
    }
};